package com.ruoyi.system.enums;

import com.google.common.collect.Lists;
import lombok.Getter;

import java.util.ArrayList;
import java.util.List;

/**
 * 操作动作枚举（含 code 和 desc）
 */
@Getter
public enum OperateActionEnum {
    /**
     * 状态变更（如设计状态从“排期中”变为“设计中”）
     */
    STATUS_CHANGE("STATUS_CHANGE", "状态变更"),

    /**
     * 添加设计代办
     */
    ADD_DESIGN_TODO("ADD_DESIGN_TODO", "添加设计待办"),

    /**
     * 完成设计待办
     */
    COMPLETE_DESIGN_TODO("COMPLETE_DESIGN_TODO", "完成设计待办"),

    /**
     * 修改设计
     */
    UPDATE_DESIGN("UPDATE_DESIGN", "修改设计"),
    /**
     * 文件上传（如设计方案图片上传、附件上传）
     */
    FILE_UPLOAD("FILE_UPLOAD", "文件上传"),
    /**
     * 文件删除（如设计图片删除、冗余附件清理）
     */
    FILE_DELETE("FILE_DELETE", "文件删除"),
    /**
     * 数据新增（如新增设计基础信息、新增设计方案）
     */
    DATA_ADD("DATA_ADD", "数据新增"),
    /**
     * 数据编辑（如修改方案名称、调整设计进度）
     */
    DATA_EDIT("DATA_EDIT", "数据编辑"),
    /**
     * 数据删除（如删除设计方案、逻辑删除日志记录）
     */
    DATA_DELETE("DATA_DELETE", "数据删除");
    /**
     * 枚举编码（对应原静态常量值，用于数据库存储 / 接口传输）
     */
    private final String code;
    /**
     * 枚举释义（中文说明，用于前端显示）
     */
    private final String desc;

    /**
     * 构造方法
     *
     * @param code 枚举编码
     * @param desc 枚举释义
     */
    OperateActionEnum(String code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    /**
     * 获取设计所需要的所有动作
     *
     * @return
     */
    public static List<String> getAllDesignActionCodes() {
        return Lists.newArrayList(
                OperateActionEnum.STATUS_CHANGE.getCode(),
                OperateActionEnum.DATA_ADD.getCode(),
                OperateActionEnum.DATA_EDIT.getCode(),
                OperateActionEnum.UPDATE_DESIGN.getCode());
    }

    /**
     * 根据 code 获取枚举项（用于从数据库 / 接口参数反向解析枚举）
     *
     * @param code 枚举编码
     * @return 对应的枚举项，无匹配时返回 null
     */
    public static OperateActionEnum getByCode(String code) {
        for (OperateActionEnum action : values()) {
            if (action.getCode().equals(code)) {
                return action;
            }
        }
        return null;
    }

    /**
     * 获取所有操作动作的枚举列表（用于前端下拉选择、字典初始化）
     * @return 封装后的VO列表（隐藏枚举内部细节，仅暴露必要的code和desc）
     */
    public static List<OperateActionVO> getAllActionList() {
        List<OperateActionVO> actionVOList = new ArrayList<>(values().length);
        for (OperateActionEnum action : values()) {
            OperateActionVO vo = new OperateActionVO();
            vo.setCode(action.getCode());
            vo.setDesc(action.getDesc());
            actionVOList.add(vo);
        }
        return actionVOList;
    }

    /**
     * 操作动作VO类（用于接口返回，解耦枚举与前端数据结构）
     */
    @Getter
    public static class OperateActionVO {
        /**
         * 操作编码
         */
        private String code;
        /**
         * 操作释义
         */
        private String desc;

        /**
         * 仅允许枚举内部赋值，外部无法修改，保证数据一致性
         *
         * @param code 操作编码
         */
        private void setCode(String code) {
            this.code = code;
        }

        /**
         * 仅允许枚举内部赋值，外部无法修改，保证数据一致性
         *
         * @param desc 操作释义
         */
        private void setDesc(String desc) {
            this.desc = desc;
        }
    }
}
